{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np  # 矩阵操作\n",
    "import pandas as pd # SQL数据处理\n",
    "\n",
    "from sklearn.metrics import r2_score  #评价回归预测模型的性能\n",
    "\n",
    "import matplotlib.pyplot as plt   #画图\n",
    "from dateutil.parser import parse \n",
    "\n",
    "# 图形出现在Notebook里而不是新窗口\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>dteday</th>\n",
       "      <th>season</th>\n",
       "      <th>yr</th>\n",
       "      <th>mnth</th>\n",
       "      <th>holiday</th>\n",
       "      <th>weekday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>weathersit</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>casual</th>\n",
       "      <th>registered</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2011-01-01</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.344167</td>\n",
       "      <td>0.363625</td>\n",
       "      <td>0.805833</td>\n",
       "      <td>0.160446</td>\n",
       "      <td>331</td>\n",
       "      <td>654</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>2011-01-02</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.363478</td>\n",
       "      <td>0.353739</td>\n",
       "      <td>0.696087</td>\n",
       "      <td>0.248539</td>\n",
       "      <td>131</td>\n",
       "      <td>670</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>2011-01-03</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.196364</td>\n",
       "      <td>0.189405</td>\n",
       "      <td>0.437273</td>\n",
       "      <td>0.248309</td>\n",
       "      <td>120</td>\n",
       "      <td>1229</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>2011-01-04</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>0.212122</td>\n",
       "      <td>0.590435</td>\n",
       "      <td>0.160296</td>\n",
       "      <td>108</td>\n",
       "      <td>1454</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>2011-01-05</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.226957</td>\n",
       "      <td>0.229270</td>\n",
       "      <td>0.436957</td>\n",
       "      <td>0.186900</td>\n",
       "      <td>82</td>\n",
       "      <td>1518</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>dteday</th>\n",
       "      <th>season</th>\n",
       "      <th>yr</th>\n",
       "      <th>mnth</th>\n",
       "      <th>holiday</th>\n",
       "      <th>weekday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>weathersit</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>casual</th>\n",
       "      <th>registered</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2011-01-01</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.344167</td>\n",
       "      <td>0.363625</td>\n",
       "      <td>0.805833</td>\n",
       "      <td>0.160446</td>\n",
       "      <td>331</td>\n",
       "      <td>654</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>2011-01-02</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.363478</td>\n",
       "      <td>0.353739</td>\n",
       "      <td>0.696087</td>\n",
       "      <td>0.248539</td>\n",
       "      <td>131</td>\n",
       "      <td>670</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>2011-01-03</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.196364</td>\n",
       "      <td>0.189405</td>\n",
       "      <td>0.437273</td>\n",
       "      <td>0.248309</td>\n",
       "      <td>120</td>\n",
       "      <td>1229</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>2011-01-04</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>0.212122</td>\n",
       "      <td>0.590435</td>\n",
       "      <td>0.160296</td>\n",
       "      <td>108</td>\n",
       "      <td>1454</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>2011-01-05</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.226957</td>\n",
       "      <td>0.229270</td>\n",
       "      <td>0.436957</td>\n",
       "      <td>0.186900</td>\n",
       "      <td>82</td>\n",
       "      <td>1518</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv(\"day.csv\")\n",
    "\n",
    "#通过观察前5行，了解数据每列（特征）的概况\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(366, 16)"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 按照yr字段分割训练数据和测试数据\n",
    "# 训练数据\n",
    "train_data=data[(data[u'yr']==0)]\n",
    "# 测试数据\n",
    "test_data=data[data[u'yr']==1]\n",
    "\n",
    "test_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(366, 10)"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从原始数据中分离输入特征x和输出y\n",
    "train_base_day = parse('2011/1/1')\n",
    "test_base_day = parse('2012/1/1')\n",
    "train_dayset_X = train_data['dteday'].map(lambda thisday:(parse(thisday)-train_base_day).days)\n",
    "test_dayset_X = test_data['dteday'].map(lambda thisday:(parse(thisday)-test_base_day).days)\n",
    "train_df=pd.DataFrame({'dayset':train_dayset_X})\n",
    "test_df=pd.DataFrame({'dayset':test_dayset_X})\n",
    "\n",
    "\n",
    "\n",
    "train_y = train_data['cnt'].values\n",
    "train_X = train_data.drop(['cnt','dteday','casual','registered','instant','season','mnth'], axis = 1)\n",
    "train_X = pd.concat([train_X,train_df],axis=1)\n",
    "test_y = test_data['cnt'].values\n",
    "test_X = test_data.drop(['cnt','dteday','casual','registered','instant','season','mnth'], axis = 1)\n",
    "test_X = pd.concat([test_X,test_df],axis=1)\n",
    "\n",
    "\n",
    "# train_X['dteday'].replace(train_dayset_X)\n",
    "#用于后续显示权重系数对应的特征\n",
    "columns = train_X.columns\n",
    "\n",
    "test_X.shape\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Index([u'yr', u'holiday', u'weekday', u'workingday', u'weathersit', u'temp',\n       u'atemp', u'hum', u'windspeed', u'dayset'],\n      dtype='object')\n"
     ]
    }
   ],
   "source": [
    "print(columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(366, 10)"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.2)\n",
    "X_train = train_X\n",
    "X_test = test_X\n",
    "y_train = train_y\n",
    "y_test = test_y\n",
    "X_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(366L, 1L)"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 分别初始化对特征和目标值的标准化器\n",
    "ss_X = StandardScaler()\n",
    "ss_y = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征以及目标值进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)\n",
    "X_test = ss_X.transform(X_test)\n",
    "\n",
    "\n",
    "#对y做标准化不是必须\n",
    "#对y标准化的好处是不同问题的w差异不太大，同时正则参数的范围也有限\n",
    "y_train = ss_y.fit_transform(y_train.reshape(-1, 1))\n",
    "y_test = ss_y.transform(y_test.reshape(-1, 1))\n",
    "y_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The r2 score of RidgeCV on test is -0.7334608145669002\nThe r2 score of RidgeCV on train is 0.7303424152555983\n"
     ]
    }
   ],
   "source": [
    "#岭回归／L2正则\n",
    "#class sklearn.linear_model.RidgeCV(alphas=(0.1, 1.0, 10.0), fit_intercept=True, \n",
    "#                                  normalize=False, scoring=None, cv=None, gcv_mode=None, \n",
    "#                                  store_cv_values=False)\n",
    "from sklearn.linear_model import  RidgeCV\n",
    "\n",
    "#设置超参数（正则参数）范围\n",
    "alphas = [ 0.01, 0.1, 1, 10,100]\n",
    "\n",
    "\n",
    "#生成一个RidgeCV实例\n",
    "ridge = RidgeCV(alphas=alphas, store_cv_values=True)  \n",
    "\n",
    "# 使用默认配置初始化\n",
    "lr = LinearRegression()\n",
    "\n",
    "# 训练模型参数\n",
    "lr.fit(X_train, y_train)\n",
    "\n",
    "#模型训练\n",
    "ridge.fit(X_train, y_train)    \n",
    "\n",
    "#预测\n",
    "y_test_pred_ridge = ridge.predict(X_test)\n",
    "y_train_pred_ridge = ridge.predict(X_train)\n",
    "\n",
    "\n",
    "# 评估，使用r2_score评价模型在测试集和训练集上的性能\n",
    "print 'The r2 score of RidgeCV on test is', r2_score(y_test, y_test_pred_ridge)\n",
    "print 'The r2 score of RidgeCV on train is', r2_score(y_train, y_train_pred_ridge)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11281400>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('alpha is:', 10.0)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>coef_lr</th>\n",
       "      <th>coef_ridge</th>\n",
       "      <th>columns</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>[0.7271422645881537]</td>\n",
       "      <td>[0.37552155233954954]</td>\n",
       "      <td>temp</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>[0.2280154223871339]</td>\n",
       "      <td>[0.2212149739229611]</td>\n",
       "      <td>dayset</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>[0.030583251117401233]</td>\n",
       "      <td>[0.03016980397494784]</td>\n",
       "      <td>weekday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>[0.005100145176240366]</td>\n",
       "      <td>[0.0054914952509876325]</td>\n",
       "      <td>workingday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>[0.0]</td>\n",
       "      <td>[0.0]</td>\n",
       "      <td>yr</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>[-0.04368693037417112]</td>\n",
       "      <td>[-0.03992830068718278]</td>\n",
       "      <td>holiday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>[-0.04836128659691727]</td>\n",
       "      <td>[0.2980525936598556]</td>\n",
       "      <td>atemp</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>[-0.05900500143077325]</td>\n",
       "      <td>[-0.06090045025742907]</td>\n",
       "      <td>hum</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>[-0.1383775326423962]</td>\n",
       "      <td>[-0.130487128718228]</td>\n",
       "      <td>windspeed</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>[-0.21110722521489164]</td>\n",
       "      <td>[-0.20373050993952424]</td>\n",
       "      <td>weathersit</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>coef_lr</th>\n",
       "      <th>coef_ridge</th>\n",
       "      <th>columns</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>[0.7271422645881537]</td>\n",
       "      <td>[0.37552155233954954]</td>\n",
       "      <td>temp</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>[0.2280154223871339]</td>\n",
       "      <td>[0.2212149739229611]</td>\n",
       "      <td>dayset</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>[0.030583251117401233]</td>\n",
       "      <td>[0.03016980397494784]</td>\n",
       "      <td>weekday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>[0.005100145176240366]</td>\n",
       "      <td>[0.0054914952509876325]</td>\n",
       "      <td>workingday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>[0.0]</td>\n",
       "      <td>[0.0]</td>\n",
       "      <td>yr</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>[-0.04368693037417112]</td>\n",
       "      <td>[-0.03992830068718278]</td>\n",
       "      <td>holiday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>[-0.04836128659691727]</td>\n",
       "      <td>[0.2980525936598556]</td>\n",
       "      <td>atemp</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>[-0.05900500143077325]</td>\n",
       "      <td>[-0.06090045025742907]</td>\n",
       "      <td>hum</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>[-0.1383775326423962]</td>\n",
       "      <td>[-0.130487128718228]</td>\n",
       "      <td>windspeed</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>[-0.21110722521489164]</td>\n",
       "      <td>[-0.20373050993952424]</td>\n",
       "      <td>weathersit</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mse_mean = np.mean(ridge.cv_values_, axis = 0)\n",
    "plt.plot(np.log10(alphas), mse_mean.reshape(len(alphas),1)) \n",
    "\n",
    "\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()\n",
    "\n",
    "print ('alpha is:', ridge.alpha_)\n",
    "\n",
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\":list(columns), \"coef_lr\":list((lr.coef_.T)), \"coef_ridge\":list((ridge.coef_.T))})\n",
    "fs.sort_values(by=['coef_lr'],ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The r2 score of LassoCV on test is -0.9165108448138721\nThe r2 score of LassoCV on train is 0.6442206398832193\n"
     ]
    }
   ],
   "source": [
    "### Lasso／L1正则\n",
    "# class sklearn.linear_model.LassoCV(eps=0.001, n_alphas=100, alphas=None, fit_intercept=True, \n",
    "#                                    normalize=False, precompute=’auto’, max_iter=1000, \n",
    "#                                    tol=0.0001, copy_X=True, cv=None, verbose=False, n_jobs=1,\n",
    "#                                    positive=False, random_state=None, selection=’cyclic’)\n",
    "from sklearn.linear_model import LassoCV\n",
    "\n",
    "#设置超参数搜索范围\n",
    "#alphas = [ 0.01, 0.1, 1, 10,100]\n",
    "\n",
    "#生成一个LassoCV实例\n",
    "#lasso = LassoCV(alphas=alphas)  \n",
    "lasso = LassoCV()  \n",
    "\n",
    "#训练（内含CV）\n",
    "lasso.fit(X_train, y_train)  \n",
    "\n",
    "#测试\n",
    "y_test_pred_lasso = lasso.predict(X_test)\n",
    "y_train_pred_lasso = lasso.predict(X_train)\n",
    "\n",
    "\n",
    "# 评估，使用r2_score评价模型在测试集和训练集上的性能\n",
    "print 'The r2 score of LassoCV on test is', r2_score(y_test, y_test_pred_lasso)\n",
    "print 'The r2 score of LassoCV on train is', r2_score(y_train, y_train_pred_lasso)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10f73438>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('alpha is:', 0.16703196638946255)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>coef_lasso</th>\n",
       "      <th>coef_lr</th>\n",
       "      <th>coef_ridge</th>\n",
       "      <th>columns</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>[0.7271422645881537]</td>\n",
       "      <td>[0.37552155233954954]</td>\n",
       "      <td>temp</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.101937</td>\n",
       "      <td>[0.2280154223871339]</td>\n",
       "      <td>[0.2212149739229611]</td>\n",
       "      <td>dayset</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>[0.030583251117401233]</td>\n",
       "      <td>[0.03016980397494784]</td>\n",
       "      <td>weekday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>[0.005100145176240366]</td>\n",
       "      <td>[0.0054914952509876325]</td>\n",
       "      <td>workingday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>[0.0]</td>\n",
       "      <td>[0.0]</td>\n",
       "      <td>yr</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.000000</td>\n",
       "      <td>[-0.04368693037417112]</td>\n",
       "      <td>[-0.03992830068718278]</td>\n",
       "      <td>holiday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.568091</td>\n",
       "      <td>[-0.04836128659691727]</td>\n",
       "      <td>[0.2980525936598556]</td>\n",
       "      <td>atemp</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-0.000000</td>\n",
       "      <td>[-0.05900500143077325]</td>\n",
       "      <td>[-0.06090045025742907]</td>\n",
       "      <td>hum</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.000000</td>\n",
       "      <td>[-0.1383775326423962]</td>\n",
       "      <td>[-0.130487128718228]</td>\n",
       "      <td>windspeed</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.096913</td>\n",
       "      <td>[-0.21110722521489164]</td>\n",
       "      <td>[-0.20373050993952424]</td>\n",
       "      <td>weathersit</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>coef_lasso</th>\n",
       "      <th>coef_lr</th>\n",
       "      <th>coef_ridge</th>\n",
       "      <th>columns</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>[0.7271422645881537]</td>\n",
       "      <td>[0.37552155233954954]</td>\n",
       "      <td>temp</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.101937</td>\n",
       "      <td>[0.2280154223871339]</td>\n",
       "      <td>[0.2212149739229611]</td>\n",
       "      <td>dayset</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>[0.030583251117401233]</td>\n",
       "      <td>[0.03016980397494784]</td>\n",
       "      <td>weekday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>[0.005100145176240366]</td>\n",
       "      <td>[0.0054914952509876325]</td>\n",
       "      <td>workingday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>[0.0]</td>\n",
       "      <td>[0.0]</td>\n",
       "      <td>yr</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.000000</td>\n",
       "      <td>[-0.04368693037417112]</td>\n",
       "      <td>[-0.03992830068718278]</td>\n",
       "      <td>holiday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.568091</td>\n",
       "      <td>[-0.04836128659691727]</td>\n",
       "      <td>[0.2980525936598556]</td>\n",
       "      <td>atemp</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-0.000000</td>\n",
       "      <td>[-0.05900500143077325]</td>\n",
       "      <td>[-0.06090045025742907]</td>\n",
       "      <td>hum</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.000000</td>\n",
       "      <td>[-0.1383775326423962]</td>\n",
       "      <td>[-0.130487128718228]</td>\n",
       "      <td>windspeed</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.096913</td>\n",
       "      <td>[-0.21110722521489164]</td>\n",
       "      <td>[-0.20373050993952424]</td>\n",
       "      <td>weathersit</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mses = np.mean(lasso.mse_path_, axis = 1)\n",
    "plt.plot(np.log10(lasso.alphas_), mses) \n",
    "#plt.plot(np.log10(lasso.alphas_)*np.ones(3), [0.3, 0.4, 1.0])\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()    \n",
    "            \n",
    "print ('alpha is:', lasso.alpha_)\n",
    "\n",
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\":list(columns), \"coef_lr\":list((lr.coef_.T)), \"coef_ridge\":list((ridge.coef_.T)), \"coef_lasso\":list((lasso.coef_.T))})\n",
    "fs.sort_values(by=['coef_lr'],ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x110114e0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('alpha is:', 0.16703196638946255)\n"
     ]
    }
   ],
   "source": [
    "mses = np.mean(lasso.mse_path_, axis = 1)\n",
    "plt.plot(np.log10(lasso.alphas_), mses) \n",
    "#plt.plot(np.log10(lasso.alphas_)*np.ones(3), [0.3, 0.4, 1.0])\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()    \n",
    "            \n",
    "print ('alpha is:', lasso.alpha_)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
